home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr50
/
mlibv22.zip
/
DEMO1.BAS
< prev
next >
Wrap
BASIC Source File
|
1993-01-27
|
18KB
|
635 lines
'******************************** DEMO1.BAS *********************************
'* *
'* NOTE: In order for this demo to run you must start the QB editor *
'* : along with the library MLIBN.QLB (ie., QB/L MLIBN). *
'* : *
'* : IF YOU ARE NOT USING QuickBASIC 4.0- 4.5 SEE PAGE 2 OF THE MANUAL *
'* : BEFORE TRYING TO RUN THIS DEMO! *
'* : *
'* *
'****************************************************************************
TYPE MagType
x1 AS INTEGER
y1 AS INTEGER
NX AS INTEGER
NY AS INTEGER
WD AS INTEGER
HT AS INTEGER
END TYPE
DEFINT A-Z
'$INCLUDE: 'mlib.inc'
DECLARE SUB Doodle ()
DECLARE SUB DoSelect (Choice$, MX%, MY%)
DECLARE SUB Effects ()
DECLARE SUB EndIt ()
DECLARE SUB Magnify ()
DECLARE SUB OpenMsg ()
DECLARE SUB HelpBar ()
DECLARE SUB ReadData ()
DECLARE SUB Reverse (Choice$)
DECLARE SUB ScanPix (MG() AS ANY, N%)
DECLARE SUB ZLoop ()
DECLARE SUB ZMHold (B%, X%, Y%)
DECLARE FUNCTION InDoodleArea% ()
DECLARE FUNCTION InMagnifyArea% ()
DECLARE FUNCTION InMenuArea% ()
DECLARE FUNCTION OnTarget% (Selection%)
'============================================================================
SCREEN 12: CLS : CALL InitPointer(NumBut%) 'Initialize mouse.
IF NumBut% = 0 THEN EndIt 'No mouse.
CALL DClicRate(7) '<= DEFAULT=9 1/2 Sec. 'Set double click speed.
CALL DClicBut(1) '<= DEFAULT=1 Left button 'Check left mouse button.
CALL DClicOn '<= DEFAULT=ON 'Turn double click on.
'
OpenMsg '
'
OPTION BASE 1 '
DIM SHARED Buf(1 TO 4, 1 TO 120) '
DIM SHARED Shape$(3), HotX%(3), HotY%(3) '
DIM SHARED MG(1) AS MagType '
'
GOSUB SetUp '
'
CALL ReadData 'Convert DATA into a shape.
'
CALL ChangePointer(Shape$(1), HotX%(1), HotY%(1))'Hand shape.
'DATA block 1.
CALL ShowPointer '
'
DO 'Main loop.
'
DO '
CALL DClicM(BUT%, MX%, MY%, Dble%) 'Get mouse button/location
'and double click info.
Ky$ = INKEY$ '
'
LOOP UNTIL Ky$ = CHR$(27) OR BUT% = 1 '
'
IF LEN(Ky$) THEN '
'
EndIt '
'
ELSEIF InMenuArea% THEN '
'
IF Dble% THEN '
CALL DoSelect(Choice$, MX%, MY%) '
ELSE '
CALL Reverse(Choice$) '
END IF '
'
ELSEIF Choice$ = "Doodle" THEN Doodle '
'
ELSEIF Choice$ = "Magnify" THEN Magnify '
'
'
END IF '
'
LOOP WHILE Ky$ <> CHR$(27) '
'
CALL EndIt '
'
'============================================================================
'Subroutine ReadData converts this DATA back into a 64 byte string.
'Hand.
'Source : DEMO.SHP
'Destination : DATA.DAT
'Record : 2
'Format : SOLID
DATA &H4,&H0,&HF3FD,&HE1FA,&HE1FB,&HE1FA,&HE1FD,&HE049,&HE000
DATA &H8000,&H0,&H0,&H0,&H0,&H8000,&HC001,&HE003,&HE003
DATA &H0,&HC00,&HC00,&HC00,&HC00,&HC00,&HDB6,&HDB6,&H6DB6
DATA &H6FFE,&H6FFE,&H7FFE,&H3FFE,&H1FFC,&HFF8,&H0
'Magnify
'Source : DEMO.SHP
'Destination : DATA.DAT
'Record : 11
'Format : SOLID
DATA &H6,&H5,&HE07D,&HD0BA,&HBFDB,&H7FEA,&H3BCD,&H3D4F,&H2BCF
DATA &H3DCF,&H7FEF,&HBFDF,&HD08F,&HE057,&HFFEB,&HFFF5,&HFFFA,&HFFFC
DATA &H0,&HF00,&H0,&H0,&H4420,&H42A0,&H5420,&H4220,&H0
DATA &H0,&HF00,&H0,&H0,&H0,&H0,&H0
'*** REM this block to view pen in non color. ***
'Pen.
'Source : DEMO.SHP
'Destination : DATA.DAT
'Record : 5
'Format : SOLID
DATA &H0,&HF,&HBFE1,&H5FD0,&H7FA0,&H5F41,&HBE83,&HFF07,&HFE0F
DATA &HFC1F,&HF83F,&HF07F,&HE0FF,&HC1FF,&HC3FF,&HC7FF,&HBFFF,&H7FFF
DATA &H0,&H6,&HC,&H18,&H30,&H60,&HC0,&H180,&H300
DATA &H600,&HC00,&H1800,&H1000,&H0,&H0,&H0
'Pen
'Source : DEMO.SHP
'Destination : DATA.DAT
'Record : 21
'Format : TRANS
DATA &H0,&HF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF,&HFFFF
DATA &H401E,&HA02F,&H805F,&HA0BE,&H417C,&HF8,&H1F0,&H3E0,&H7C0
DATA &HF80,&H1F00,&H3E00,&H3C00,&H3800,&H4000,&H8000
'============================================================================
SetUp:
NWide% = 9: NHigh% = NWide% 'Number of gridblocks hor/ver.
GSizeH% = 15: GSizeV% = GSizeH% 'Size of each gridblock.
En% = 1
MG(En%).x1 = 480 'X coordinates.
MG(En%).y1 = 14 'Y coordinates.
MG(En%).NX = NWide% 'Number of grid blocks wide.
MG(En%).NY = NHigh% 'Number of grid blocks high.
MG(En%).WD = GSizeH% 'Width of each block (In pixels).
MG(En%).HT = GSizeV% 'Height of each block (In pixels).
PX1% = MG(En%).x1
PY1% = MG(En%).y1
PX2% = PX1% + NWide% * GSizeH%
PY2% = PY1% + NHigh% * GSizeV%
LINE (PX1% - 1, PY1% - 1)-(PX2%, PY2%), 15, B
LINE (PX1% - 1, PY2% + 15)-(PX2%, PY2% + 296), 15, B
LINE (PX1%, PY2% + 16)-(PX2% - 1, PY2% + 295), 4, BF
LINE (10, 13)-(470, 35), 15, B
LOCATE 2, 7
PRINT " Quit Effects Magnify Doodle "
CALL HelpBar
RETURN
SUB Doodle
IF InDoodleArea% THEN '
'
CALL GetButtonM(Dummy%, MX%, MY%) '
CALL HidePointer '
PSET (MX%, MY%), 15 'Update position.
CALL ShowPointer '
'
DO '
'
ZMHold BUT%, MX%, MY% 'Loop while pointer is in
'the same position.
IF InDoodleArea% THEN '
CALL HidePointer 'Draw a line from old pos
LINE -(MX%, MY%), 15 'to new.
CALL ShowPointer '
ELSE '
EXIT DO '
END IF '
'
LOOP WHILE BUT% '
'
END IF '
END SUB
SUB DoSelect (Choice$, MX%, MY%)
Col% = (MX% \ 8) + 1 'For 8 X 16 character size, SCREEN 12.
Row% = (MY% \ 16) + 1
IF Row% = 2 THEN
SELECT CASE Col%
CASE 7 TO 16 '................. Quit
EndIt
CASE 17 TO 29 '................. Effects
'*
'* For demonstration puposes we will:
'*
'* - get the size of the mouse enviroment
'* - save the mouse state
'* - restore the mouse state
'*
Size% = GetSizeM% 'Get size of environment.
Buffer$ = SPACE$(Size%) 'Buffer$ needs to be the
'same size as the mouse
'environment.
HidePointer
CALL SaveStateM(Buffer$, ErrNum%) 'Save environment.
CALL Effects
CALL RestoreStateM(Buffer$, ErrNum%)'Restore environment.
IF ErrNum% THEN 'If an error occurred,
SetPointer MX%, MY% 'set pointer in original
END IF 'position.
ShowPointer
CASE 30 TO 42 '................. Magnify
Choice$ = "Magnify"
ChangePointer Shape$(2), HotX%(2), HotY%(2)'Mag glass.
'DATA block 2.
CASE 43 TO 54 '................. Doodle
Choice$ = "Doodle"
ChangePointer Shape$(3), HotX%(3), HotY%(3)'Pen.
'DATA block 3.
END SELECT
END IF
END SUB
SUB Effects STATIC
GET (17 * 8 - 8, 16)-(29 * 8, 32), Buf(2, 1): PUT (17 * 8 - 8, 16), Buf(2, 1), PRESET
LOCATE 29, 2
PRINT "[ Click or key press = Stop ]" + SPACE$(47)
PosX% = 160
PosY% = 195
DO
CALL GetButtonM(BUT%, x1%, y1%)
Start! = TIMER + .1
WHILE Done! < Start!: Done! = TIMER
L1 = (L1 MOD 150) - 2
LINE (PosX% + L1, L1 + PosY%)-((PosX% * 2) - L1, (PosY% + 100) - L1), CLR, B
L2 = (L2 MOD 99) + 1
LINE (PosX% + L2, L2 + PosY%)-((PosX% * 2) - L2, (PosY% + 100) - L2), CLR, B
WEND
CLR = (CLR + 1) MOD 16
LOOP UNTIL LEN(INKEY$) OR BUT%
GET (17 * 8 - 8, 16)-(29 * 8, 32), Buf(2, 1): PUT (17 * 8 - 8, 16), Buf(2, 1), PRESET
CALL HelpBar
END SUB
SUB EndIt
SCREEN 0
CLS
END
END SUB
SUB HelpBar
VIEW PRINT
LOCATE 29, 2
PRINT "[ Click or Esc = Quit | Double Click = Effects | Click = Magnify or Doodle ]"
END SUB
FUNCTION InDoodleArea%
IF InWinM(481, 166, 613, 443) THEN
InDoodleArea% = -1
ELSE
InDoodleArea% = 0
END IF
'BASIC equivalent.
'CALL GetButtonM(BUT%, x1%, y1%)
'
'SELECT CASE x1%
'
' CASE 481 TO 613
'
' SELECT CASE y1%
'
' CASE 166 TO 443
'
' InDoodleArea% = -1
'
' CASE ELSE
'
' InDoodleArea% = 0
'
' END SELECT
'
' CASE ELSE
'
' InDoodleArea% = 0
'
'END SELECT
END FUNCTION
FUNCTION InMagnifyArea%
IF InWinM(10, 45, 470, 445) THEN
InMagnifyArea% = -1
EXIT FUNCTION
ELSE
InMagnifyArea% = 0
END IF
'BASIC equivalent.
'CALL GetButtonM(BUT%, x1%, y1%)
'
'SELECT CASE x1%
'
' CASE 10 TO 470
'
' SELECT CASE y1%
'
' CASE 45 TO 445
'
' InMagnifyArea% = -1
' EXIT FUNCTION
'
' CASE ELSE
'
' END SELECT
'
' CASE ELSE
'
'END SELECT
IF InDoodleArea% THEN
InMagnifyArea% = -1
ELSE
InMagnifyArea% = 0
END IF
END FUNCTION
FUNCTION InMenuArea%
IF InWinM(10, 13, 470, 35) THEN
InMenuArea% = -1
ELSE
InMenuArea% = 0
END IF
'BASIC equivalent.
'CALL GetButtonM(BUT%, x1%, y1%)
'
'SELECT CASE x1%
'
' CASE 10 TO 470
'
' SELECT CASE y1%
'
' CASE 13 TO 35
'
' InMenuArea% = -1
'
' CASE ELSE
'
' InMenuArea% = 0
'
' END SELECT
'
' CASE ELSE
'
' InMenuArea% = 0
'
'END SELECT
END FUNCTION
SUB Magnify
SHARED En% 'Share with main mod.
'
IF InMagnifyArea% THEN '
'
CALL ScanPix(MG(), En%) 'Scan area to magnify, and
'draw it on the screen.
ZLoop 'Loop while button is down.
'
END IF '
END SUB
FUNCTION OnTarget% (Selection%)
OnTarget% = -1 'Let CASE prove otherwise.
CALL GetButtonM(BUT%, MX%, MY%)
Col% = (MX% \ 8) + 1 'For 8 X 16 character size, screen 12.
Row% = (MY% \ 16) + 1
IF Row% = 2 THEN
SELECT CASE Col%
CASE 7 TO 16: Selection% = 1 'Quit
CASE 30 TO 42: Selection% = 3 'Magnify
CASE 43 TO 54: Selection% = 4 'Doodle
CASE ELSE
OnTarget% = 0
END SELECT
ELSE
OnTarget% = 0
END IF
IF BUT% = 0 THEN OnTarget% = 0
END FUNCTION
SUB OpenMsg
PRINT
PRINT "A very simple demo on double clicking, plus a few other general"
PRINT "mouse related procedures."
PRINT
PRINT
PRINT "Press a key/button to continue..."
DO
CALL GetButtonM(BUT%, x1%, y1%)
LOOP UNTIL BUT% OR LEN(INKEY$)
CLS
END SUB
'
'****************************************************************************
'* *
'* Read the shape DATA into the Shape$ array. *
'* *
'* *
'****************************************************************************
'
SUB ReadData
'============================================================================
Y = 0 '
'
FOR X = 1 TO 3 '
'
Y = Y + 1 '
READ HotX%(Y), HotY%(Y) 'First 2 statements are
'X and Y hotspots.
FOR xdata = 1 TO 32 '
READ SHPdata% '
Shape$(Y) = Shape$(Y) + MKI$(SHPdata%) 'Build data string.
NEXT xdata '
'
NEXT X '
'
'============================================================================
END SUB
SUB Reverse (Choice$)
Dummy% = OnTarget%(Selection%) 'Which one.
GOSUB ReverseIt 'Reverse colors.
IF OnTarget%(Selection%) THEN
CALL GetButtonM(BUT%, MX%, MY%)
CALL DoSelect(Choice$, MX%, MY%)
SaveSelection% = Selection%
WHILE OnTarget%(Selection%): WEND
IF Selection% <> SaveSelection% THEN 'Make sure Selection%
Selection% = SaveSelection% 'is the same.
END IF
ZLoop
END IF
GOSUB ReverseIt
ZLoop
EXIT SUB
ReverseIt:
HidePointer
SELECT CASE Selection%
CASE 1: GET (7 * 8 - 8, 16)-(16 * 8, 32), Buf(1, 1): PUT (7 * 8 - 8, 16), Buf(1, 1), PRESET
CASE 3: GET (30 * 8 - 8, 16)-(42 * 8, 32), Buf(3, 1): PUT (30 * 8 - 8, 16), Buf(3, 1), PRESET
CASE 4: GET (43 * 8 - 8, 16)-(54 * 8, 32), Buf(4, 1): PUT (43 * 8 - 8, 16), Buf(4, 1), PRESET
END SELECT
ShowPointer
RETURN
END SUB
SUB ScanPix (MG() AS MagType, N%) STATIC
CALL GetButtonM(BUT%, MX%, MY%)
STX% = MX% - 4 'Starting pixel position.
STY% = MY% - 4
H1% = MG(N%).WD \ 2
V1% = MG(N%).HT \ 2
XG% = MG(N%).x1 + H1%
YG% = MG(N%).y1 + V1%
RE% = STX% + MG(N%).NX - 1
CE% = STY% + MG(N%).NY - 1
CALL HidePointer
'Scan left to right.
FOR SX% = STX% TO RE%
'Scan top to bottom.
FOR SY% = STY% TO CE%
Colr% = POINT(SX%, SY%)
'Calculate row and column.
R1% = XG% + ((SX% - STX%) * MG(N%).WD)
C1% = YG% + ((SY% - STY%) * MG(N%).HT)
'Draw a filled box with the same color as the pixel.
LINE (R1% - H1%, C1% - V1%)-(R1% + H1%, C1% + V1%), Colr%, BF
NEXT SY%
NEXT SX%
CALL ShowPointer
END SUB
SUB ZLoop
DO
CALL GetButtonM(BUT%, x1%, y1%)
LOOP WHILE BUT%
END SUB
SUB ZMHold (B%, X%, Y%) STATIC
OldPos% = X% + Y%
DO: CALL GetButtonM(B%, X%, Y%)
LOOP UNTIL X% + Y% <> OldPos% OR B% = 0
END SUB